home *** CD-ROM | disk | FTP | other *** search
/ TPUG - Toronto PET Users Group / TPUG Users Group CD / TPUG Users Group CD.iso / AMIGA / AMICUS / AMICUS11.ADF / Modula-2 / CaseConvert / case.mod < prev    next >
Text File  |  1986-08-05  |  5KB  |  125 lines

  1. MODULE CaseConversion;
  2.  
  3. (* This program reads a Modula-2 program and converts all
  4.    key words to upper case, and other identifiers to the
  5.    form in which they were found first.
  6.  
  7.    Modified: 4/3/86 by Richie Bielak
  8.       On the AMiga make sure files are closed.
  9.  
  10.       5/18/86 Make sure the heap is destroyed, so that 
  11.       Amiga gets it's memory back.
  12.  
  13.  
  14.    Copyright (c) 1986 - by Richie Bielak
  15.    
  16.    This program maybe freely copied, but please leave my name in.
  17.    Thanks....Richie
  18.  
  19. *)
  20.  FROM Storage IMPORT DestroyHeap;
  21.  FROM InOut IMPORT OpenInput, OpenOutput, CloseInput,
  22.             CloseOutput, Done, WriteString;
  23.  FROM Symbols IMPORT  InsertSymbol, FindSymbol;
  24.  FROM Scanner IMPORT TokenType, GetToken;
  25.  IMPORT Terminal;
  26.  
  27. (* Insert standard identifiers into the symbol table *)
  28. PROCEDURE InitTable;
  29.  BEGIN
  30.   InsertSymbol('AND'); InsertSymbol('ARRAY'); InsertSymbol('BEGIN');
  31.   InsertSymbol('BY'); InsertSymbol('CASE'); InsertSymbol('CONST');
  32.   InsertSymbol('DEFINITION'); InsertSymbol('DIV'); InsertSymbol('DO');
  33.   InsertSymbol('ELSE'); InsertSymbol('ELSIF'); InsertSymbol('END');
  34.   InsertSymbol('EXIT'); InsertSymbol('EXPORT'); InsertSymbol('FOR');
  35.   InsertSymbol('FROM'); InsertSymbol('IF'); InsertSymbol('IMPLEMENTATION');
  36.   InsertSymbol('IMPORT'); InsertSymbol('IN'); InsertSymbol('LOOP');
  37.   InsertSymbol('MOD'); InsertSymbol('MODULE'); InsertSymbol('NOT');
  38.   InsertSymbol('OF'); InsertSymbol('OR'); InsertSymbol('POINTER');
  39.   InsertSymbol('PROCEDURE'); InsertSymbol('QUALIFIED'); InsertSymbol('RECORD');
  40.   InsertSymbol('REPEAT'); InsertSymbol('RETURN'); InsertSymbol('SET');
  41.   InsertSymbol('THEN'); InsertSymbol('TO'); InsertSymbol('TYPE');
  42.   InsertSymbol('UNTIL'); InsertSymbol('VAR'); InsertSymbol('WHILE');
  43.   InsertSymbol('WITH'); InsertSymbol('ABS'); InsertSymbol('BITSET');
  44.   InsertSymbol('BOOLEAN'); InsertSymbol('CAP'); InsertSymbol('CARDINAL');
  45.   InsertSymbol('CHAR'); InsertSymbol('CHR'); InsertSymbol('DEC');
  46.   InsertSymbol('DISPOSE'); InsertSymbol('EXCL'); InsertSymbol('FALSE');
  47.   InsertSymbol('FLOAT'); InsertSymbol('HALT'); InsertSymbol('HIGH');
  48.   InsertSymbol('INC'); InsertSymbol('INCL'); InsertSymbol('INTEGER');
  49.   InsertSymbol('NEW'); InsertSymbol('NIL'); InsertSymbol('ODD');
  50.   InsertSymbol('ORD'); InsertSymbol('PROC'); InsertSymbol('REAL');
  51.   InsertSymbol('TRUE'); InsertSymbol('TRUNC'); InsertSymbol('VAL');
  52.   InsertSymbol('InOut'); InsertSymbol('Write'); InsertSymbol('WriteString');
  53.   InsertSymbol('WriteLn'); InsertSymbol('Read'); InsertSymbol('ReadString');
  54.   InsertSymbol('ReadLn'); InsertSymbol('OpenInput'); 
  55.   InsertSymbol('OpenOutput'); InsertSymbol('Done'); InsertSymbol('termCH');
  56.   InsertSymbol('LONGCARD'); InsertSymbol('LONGINT');
  57.  END InitTable;
  58.  
  59. PROCEDURE ProcessFile;
  60.   VAR
  61.     CurrentToken       : TokenType;
  62.     PrettyToken, Token : ARRAY [0..80] OF CHAR;
  63.     CommentLevel       : CARDINAL;
  64.     InSingleQuote, 
  65.     InDoubleQuote      : BOOLEAN;
  66.   BEGIN
  67.     (* Initialize local variables *)
  68.     CommentLevel := 0; InSingleQuote := FALSE; InDoubleQuote := FALSE;
  69.     (* Do this until end of file *)
  70.     WHILE GetToken (CurrentToken, Token) DO
  71.       CASE CurrentToken OF
  72.         Identifier:
  73.           IF NOT (InSingleQuote OR InDoubleQuote) AND
  74.             (CommentLevel = 0) THEN
  75.             IF FindSymbol (Token, PrettyToken) THEN
  76.               WriteString (PrettyToken)
  77.             ELSE
  78.               InsertSymbol (Token); WriteString (Token)
  79.             END
  80.           ELSE
  81.             WriteString (Token);
  82.           END;
  83.         |
  84.         OpenComment: IF NOT (InSingleQuote AND InDoubleQuote) THEN
  85.                    INC (CommentLevel);
  86.                      END;
  87.         |
  88.         CloseComment: IF NOT (InSingleQuote AND InDoubleQuote) AND
  89.                          (CommentLevel > 0) THEN
  90.                          DEC (CommentLevel) 
  91.                        END;
  92.         |
  93.         SingleQ: IF NOT InDoubleQuote AND (CommentLevel = 0) THEN
  94.                    InSingleQuote := NOT InSingleQuote;
  95.                  END;
  96.         |
  97.         DoubleQ: IF NOT InSingleQuote AND (CommentLevel = 0) THEN
  98.                    InDoubleQuote := NOT InDoubleQuote
  99.                  END;
  100.       END; (* CASE *)
  101.     END; (* WHILE *)
  102.   END ProcessFile;
  103.  
  104. BEGIN
  105.   InitTable;
  106.   Terminal.WriteString ('=== Modula-2 Case Converter ==='); 
  107.   Terminal.WriteLn;
  108.   OpenInput ('.MOD');
  109.   IF NOT Done THEN
  110.       Terminal.WriteString('Cannot open input file !!'); 
  111.       Terminal.WriteLn; 
  112.   ELSE
  113.     OpenOutput ('.MOD');
  114.     IF Done THEN 
  115.       ProcessFile;
  116.       CloseOutput ();
  117.     ELSE
  118.       Terminal.WriteString ("Cannot open output file !!!"); 
  119.       Terminal.WriteLn;
  120.     END;
  121.     CloseInput(); 
  122.   END;
  123.   DestroyHeap;
  124. END CaseConversion.
  125.